Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

四阶段分别为:服务构建、环境准备、容器创建和填充容器

服务构建

  • 首先把传入的资源加载器、主方法类记录到内存中,然后逐一判断对应的服务类是否存在来确定web服务的类型
    • 默认是基于servlet的web服务,如tomcat,还有响应式非阻塞服务reactive,如spring-webflux,还有什么都不是的none
  • 确定完选择哪个web服务后就是加载初始化类了,会去读取META-INF/spring.factories文件中的注册初始化、上下文初始化和监听器这三个配置
  • 最后是通过运行栈stackTrace判断main方法所在类

环境准备

  • 先new一个启动上下文 bootstrapContext,然后调用启动注册初始化器中的初始化方法 initialize,但由于没有没默认的初始化器,所以也没初始化什么(这个可以靠手动添加)
  • java.awt.headless 设置为 true,表示缺少显示器、键盘等输出设备也能正常启动
  • 然后启动运行监听器,同时发布启动事件,获取并加载springboot工程配置文件中监听器,就可以做到通过监听事件在启动的流程中加入自定义逻辑
  • 接下来就是组装启动参数,例如根据不同的web服务构造不同的环境(默认是servlet)、坏境变量、jvm系统属性等,把这些信息加载到一个内存集合中,后续调用就无需重新加载了

容器创建

  • 根据服务类型创建容器(默认servlet)注解配置的servlet-web服务容器
    • 存放和生产bean实例的Bean工厂
    • 用来解析 @Component@ComponentScan 等注解的配置类后处理器
    • 用来解析 @AutoWired@Value等注解的自动注解bean处理器
  • 对容器中的部分属性进行初始化

填充容器

  • 生产自身提供或者自定义的所有Bean对象,放入容器创建步骤中创建好的容器中,这个过程也叫做自动装配
  • 构造启动web服务器
  • 回调自定义实现的 Runner 接口,来处理执行后定制化的需求

评论